#include <iostream>

using namespace std;
//  虚函数原理：

// 重载
void print(int x)
{
    cout << "静态多态int：" << x << endl;
}
void print(double x)
{
    cout << "静态多态double：" << x << endl;
}

template <typename T>
void print(T x)
{
    cout << "静态多态模板：" << x << endl;
}

// 动态多态
class Animal
{
public:
    virtual void speak()
    { // 虚函数
        cout << "Animal sound" << endl;
    }
};
class Dog : public Animal
{
public:
    void speak() override
    {
        cout << "汪汪!" << endl;
    }
};

void makeSound(Animal *a)
{
    a->speak(); // 运行时决定调用哪个函数
}

int main()
{
    cout << "静态多态函数重载：" << endl;
    print(10);   // 调用 print(int x)
    print(10.5); // 调用 print(double x)
    cout << "静态多态模板函数：" << endl;
    print("Hello"); // 调用模板函数 print(T x)
    print(10);      // 调用模板函数 print(int x)
    cout << "动态多态虚函数：" << endl;
    Animal a;
    Dog d;
    makeSound(&a); // 输出 "Animal sound"
    makeSound(&d); // 输出 "汪汪!"

    return 0;
}